#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
std::mutex mtx;
void foo(int &num)
{
    //  unique_lock管理锁
    // 1、可以手动解锁
    // 2、解锁后可再次加锁
    std::unique_lock<mutex> lock{mtx};
    num++;
    lock.unlock();
}
int main()
{
    int num{1};
    thread t1(foo, ref(num));
    thread t2(foo, ref(num));
    t1.join();
    t2.join();
    cout << "num is " << num << endl;
    return 0;
}
// | 构造方式                                     | 含义                       |
// | ---------------------------------------- | ------------------------ |
// | `unique_lock<mutex> lk(m);`              | 构造并自动加锁（同 `lock_guard`）。 |
// | `unique_lock<mutex> lk(m, defer_lock);`  | 构造但不加锁，后续手动 `lk.lock()`。 |
// | `unique_lock<mutex> lk(m, try_to_lock);` | 构造时尝试加锁，失败不阻塞。           |
// | `unique_lock<mutex> lk(m, adopt_lock);`  | 假设 `m` 已被当前线程加锁，直接接管。    |

// | 成员函数          | 作用               |
// | ------------- | ---------------- |
// | `lock()`      | 手动加锁。            |
// | `unlock()`    | 手动解锁。            |
// | `try_lock()`  | 尝试加锁，返回 `bool`。  |
// | `owns_lock()` | 返回是否持有锁。         |
// | `release()`   | 释放对互斥锁的控制，返回裸指针,返回原始锁。 |
// | `mutex()`     | 返回指向管理的互斥锁的指针。   |
